// 接口interface
interface Person {
  name: string;
  age: number;
  gender: string;
}

let person: Person = {
  name: "张三",
  age: 18,
  gender: "男",
};

// 类型别名type
type PersonType = {
  name: string;
  age: number;
  gender: string;
};

let personType: PersonType = {
  name: "张三",
  age: 18,
  gender: "男",
};

// type和interface的区别
// 1. type可以定义基本类型、联合类型、元组等类型，而interface只能定义对象类型
// 2. type可以通过typeof获取一个变量的类型，而interface不能
// 3. type可以通过交叉类型（&）和联合类型（|）实现接口的继承，而interface只能通过extends实现继承
// 4. type可以通过条件类型（条件判断）实现类型守卫，而interface不能
// 举例
type MyType = string | number; // 联合类型
type MyType2 = [string, number]; // 元组类型
type MyType3 = typeof person; // 获取person的类型
type MyType4 = Person & PersonType; // 交叉类型
// 还可以定义函数的类型
type MyType5 = () => void;
// 还可以定义条件类型
type MyType6<T> = T extends string ? string : number;


// 泛型
// T类型由使用方指定，可以理解为占位符
function identity<T>(arg: T): T {
  return arg;
}
